﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Data.Common;
using System.Data;
using Sinacor.Servico.Bovespa.Comum.ResourceAccess;

namespace Sinacor.Servico.Bovespa.ContasCorrente.ResourceAccess
{
    public class ContasCorrente : Sinacor.Infra.Service.Data.BaseResourceAccess
    {

        #region Construtor
        public ContasCorrente()
            : base(AuthorizationContext.Current.CompanyId) 
        {
        
        }

        #endregion

        
        /// <summary>
        /// Historico:
        /// Data : 18/12/2007
        /// Autor: Ludmilla Modesto 
        /// Obs.: Criado. Metodo que retorna o codigo do Cliente na atividade de Contas Correntes
        /// </summary>
        /// <returns></returns>
        public BusinessEntity.PosicaoContasCorrente
          ConsultarPosicaoContasCorrente(Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Cliente clienteRequest,
                                          Int32 codigoClienteContasCorrentes)
        {
            Sinacor.Servicos.Comum.Util.SGBD.DBParameters dbParams = new Sinacor.Servicos.Comum.Util.SGBD.DBParameters();
            BusinessEntity.PosicaoContasCorrente bePosicaoContasCorrente = null;

            BusinessEntity.PosicaoContasCorrente response = new BusinessEntity.PosicaoContasCorrente();
            OracleDataBase dbContaCorrente = base.DataBase;//OracleDataBase dbOrdem = new OracleDataBase(SessionData.GetCompanyID());

            DbCommand dbCommand;

            StringBuilder sqlComando = new StringBuilder("SELECT ");
            sqlComando.Append("SUM(B), ");
            sqlComando.Append("SUM(C), ");
            sqlComando.Append("SUM(A), ");
            sqlComando.Append("in_conta_inv ");
            sqlComando.Append("FROM V_POSCC ");
            sqlComando.Append("WHERE (cd_cliente_nor in ");
            sqlComando.Append("( :nCodcli, ");
            sqlComando.Append(":nCodclicc ) ");
            sqlComando.Append("or cd_cliente_ci  in ( ");
            sqlComando.Append(":nCodcli, ");
            sqlComando.Append(":nCodclicc ) ) ");
            sqlComando.Append("group by in_conta_inv ");

            dbParams.Add("nCodcli", DbType.Int32, clienteRequest.Codigo);
            dbParams.Add("nCodclicc", DbType.Int32, codigoClienteContasCorrentes);

            dbCommand = dbContaCorrente.GetSqlStringCommand(sqlComando.ToString());

            dbParams.PopulaParametros(dbContaCorrente, dbCommand);

            IDataReader dtReaderContaCorrente = dbContaCorrente.ExecuteReader(dbCommand);

            Parametros parametros = new Parametros();
            DateTime dataContasCorrente = parametros.RecuperarDataSistemaContasCorrentes();

            //20080424 18:15 - Alterado - DMilanez.7Comm
            bePosicaoContasCorrente = new BusinessEntity.PosicaoContasCorrente();
            bePosicaoContasCorrente.ContasCorrente = new List<BusinessEntity.ContaCorrente>();

            while (dtReaderContaCorrente.Read())
            {
                BusinessEntity.ContaCorrente beContasCorrente = new BusinessEntity.ContaCorrente();

                beContasCorrente.NegociosDia = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderContaCorrente[BusinessEntity.ContaCorrente.ConsultarPosicaoContasCorrente.QuantidadeDias]);

                beContasCorrente.Disponivel = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderContaCorrente[BusinessEntity.ContaCorrente.ConsultarPosicaoContasCorrente.QuantidadeDisponivel]);

                beContasCorrente.Projetado = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderContaCorrente[BusinessEntity.ContaCorrente.ConsultarPosicaoContasCorrente.QuantidadeProjetada]);

                beContasCorrente.isContaInvestimento = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dtReaderContaCorrente[BusinessEntity.ContaCorrente.ConsultarPosicaoContasCorrente.ContaInvestimento]) == "S";

                bePosicaoContasCorrente.ContasCorrente.Add(beContasCorrente);
            }

            bePosicaoContasCorrente.DataPosicao = dataContasCorrente;//20080424 17:57 - Alterado - DMilanez.7Comm

            dtReaderContaCorrente.Close();

            return bePosicaoContasCorrente;
        }



        public List<BusinessEntity.HistoricoContaCorrente> ConsultarHistoricoContasCorrentes(Sinacor.Servico.Bovespa.ContasCorrente.BusinessEntity.Parameter.FiltroHistoricoContaCorrente parameter)
        {

            List<BusinessEntity.HistoricoContaCorrente> response = new List<BusinessEntity.HistoricoContaCorrente>();

            StringBuilder sqlComando = new StringBuilder(@"SELECT CD_HISTORICO CodigoMensagem, DS_HISTFOR DescricaoMensagem, TP_HISTORICO TipoMensagem, ");
            sqlComando.Append(" NR_DIAS_PROJ DiasProjecao FROM TCCHISTO ");
            sqlComando.Append(" WHERE 1=1 ");

            if (parameter.Codigo != null)
            {
                sqlComando.Append(" AND CD_HISTORICO = :CodigoMensagem ");
            }

            if ((parameter.CodigoSistema != null) && (parameter.CodigoSistema != String.Empty))
            {
                sqlComando.Append(" AND CD_SISTEMA = :CodigoSistema ");
            }

            if ((parameter.Descricao != null) && (parameter.Descricao != string.Empty))
            {
                sqlComando.Append(" AND DS_HISTFOR LIKE '%'||:DescricaoMensagem||'%'");
            }
            
            if ((parameter.Tipo != null) && (parameter.Tipo != string.Empty))
            {
                sqlComando.Append(" AND TP_HISTORICO = :TipoMensagem ");
            }

            if (parameter.DiasProjecao != null)
            {
                sqlComando.Append(" AND NR_DIAS_PROJ = :DiasProjecaoMensagem ");
            }

            sqlComando.Append(" ORDER BY DS_HISTFOR ");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlComando.ToString()))
            {

                if (parameter.Codigo != null)
                {
                    this.DataBase.AddInParameter(command, ":CodigoMensagem", DbType.Int32, parameter.Codigo);
                }

                if (parameter.CodigoSistema != null)
                {
                    this.DataBase.AddInParameter(command, ":CodigoSistema", DbType.String, parameter.CodigoSistema);
                }

                if ((parameter.Descricao != null) && (parameter.Descricao != string.Empty))
                {
                    this.DataBase.AddInParameter(command, ":DescricaoMensagem", DbType.String, parameter.Descricao);
                }

                if (parameter.Tipo != null)
                {
                    this.DataBase.AddInParameter(command, ":TipoMensagem", DbType.String, parameter.Tipo);
                }

                if (parameter.DiasProjecao != null)
                {
                    this.DataBase.AddInParameter(command, ":DiasProjecaoMensagem", DbType.Int32, parameter.DiasProjecao);
                }

                response = FindAll<BusinessEntity.HistoricoContaCorrente>(command, reader =>
                {
                    BusinessEntity.HistoricoContaCorrente item = new Sinacor.Servico.Bovespa.ContasCorrente.BusinessEntity.HistoricoContaCorrente();

                    item.Codigo = reader.GetValue<Int32>("CodigoMensagem");
                    item.Descricao = reader.GetValue<String>("DescricaoMensagem");
                    item.Tipo = reader.GetValue<String>("TipoMensagem");
                    item.DiasProjecao = reader.GetValue<Int32>("DiasProjecao");

                    return item;
                }
                );
            }

            return response;
        }
    }
}
